package keyWords.myStatic;
import java.sql.Date;
class A{
    static{
//        static不能修饰局部变量
//        static int ss = 0;
        System.out.println("static A");
    }

    public A(){
        System.out.println("contra A");
    }
}

class B extends A{
    static{
        System.out.println("static B");
    }

    public B(){
        System.out.println("contra B");
    }
}

class Person{
    private Date birthDate;
    private static Date startDate,endDate;

    static int age = 32;

    public Person(){}

    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }

    public void print() {
        int age=3;
//    this代表什么？this代表当前对象，那么通过new Main()来调用printValue的话，
//    当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的，
//    因此在printValue中的this.value的值毫无疑问是32
        System.out.println(this.age);

    }

// 这种写法的问题在于对于每个对象都会多创建两个Date对象，浪费空间
    boolean isBornBoomer2() {
        Date startDate = Date.valueOf("1946-1-1");
        Date endDate = Date.valueOf("1964-12-31");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }

//使用静态代码块，对于整个类只会创建两个Date对象，节省了空间
// 因此，很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
    static{
        //valueOf是sql Date的方法
        startDate = Date.valueOf("1946-1-1");
        endDate = Date.valueOf("1964-12-31");
    }

    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }

    static int grow(){
//        不可修饰局部变量
//        static int s = 0;
        return 0;
    }


}


public class Static1 {

    //从节省资源的角度出发，也可以使用静态线程做一些通用操作，使得不必在方法中创建线程了
    static Runnable r1 = ()-> System.out.println("static可以修饰线程变量");

    public static void main(String[] args) {
        A a = new A();
        System.out.println();
        a = new B();

        new Person().print();

        new Thread(r1).start();
    }
}

